package com.example.leo.mycharmingstudent.a0909;

import android.Manifest;
import android.content.ContentValues;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.SimpleCursorAdapter;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

import com.example.leo.mycharmingstudent.R;
import com.example.leo.mycharmingstudent.a0905.ToastUtil;

import java.util.Locale;

/**
 * 值得注意：
 * 新创建项目，代码第一次运行会报错。
 */
public class SQLiteApiActivity extends AppCompatActivity {

    private static final String TAG = "SQLiteActivity";

    private SQLiteOpenHelper mSqLiteOpenHelper;
    //姓名输入框
    private EditText etName;
    //性别输入框
    private EditText etGender;
    //年龄输入框
    private EditText etAge;
    //编号输入框
    private EditText etId;
    //添加数据按钮
    private Button btnInsert;
    //删除数据按钮
    private Button btnDelete;
    //修改数据按钮
    private Button btnModify;
    //查询数据按钮
    private Button btnQuery;
    //学生信息列表
    private ListView lvStuInfo;


    private SQLiteDatabase mReadableDatabase;
    private Cursor mCursor;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sqlite);

        findViews();
        initData();
        initEvent();
    }

    private void findViews() {
        etName = findViewById(R.id.et_name_activity_sqlite);
        etGender = findViewById(R.id.et_gender_activity_sqlite);
        etAge = findViewById(R.id.et_age_activity_sqlite);
        etId = findViewById(R.id.et_id_activity_sqlite);
        btnInsert = findViewById(R.id.btn_insert_activity_sqlite);
        btnDelete = findViewById(R.id.btn_delete_activity_sqlite);
        btnModify = findViewById(R.id.btn_modify_activity_sqlite);
        btnQuery = findViewById(R.id.btn_query_activity_sqlite);
        lvStuInfo = findViewById(R.id.lv_student_info_activity_sqlite);
    }

    private void initData() {
        /*
        检查权限，是同步的
         */
        int permission = ContextCompat.checkSelfPermission(
                this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (permission == PackageManager.PERMISSION_GRANTED) {
            createHelper();
        } else {
            /*
             动态权限申请，是一个异步的过程。
             代码会继续向下执行。
             */
            ActivityCompat.requestPermissions(
                    this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    1);
        }
    }

    private void createHelper() {
        String path = Environment.getExternalStorageDirectory() + "/student.db";
        Log.e(TAG, path);
        mSqLiteOpenHelper = new SQLiteOpenHelper(this, path, null, 3) {

            /**
             * 创建数据库的时候，调用此方法
             */
            @Override
            public void onCreate(SQLiteDatabase db) {
                String sql = "create table student_info (_id integer primary key autoincrement," +
                        "name varchar(20)," +
                        "gender varchar(20)," +
                        "age integer)";
                db.execSQL(sql);
            }

            /**
             * 数据库版本升级的时候，调用此方法
             */
            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                String format = String.format(
                        Locale.CHINA,
                        "%d onUpgrade()打小怪升级了 %d",
                        oldVersion,
                        newVersion);
                ToastUtil.showToast(SQLiteApiActivity.this, format);
            }
        };

        /*
        以下两个方法用于获取数据库对象。
        getWritableDatabase以读写形式打开数据库，如果磁盘空间满了，报错。
        getReadableDatabase先以读写形式打开数据库，如果磁盘空间满了，
        尝试以只读方式打开数据库。
        so，推荐使用getReadableDatabase方法
         */
        /*
        调用getWritableDatabase或者getReadableDatabase方法，
        数据库存在，直接打开，版本号如果升高，执行SQLiteOpenHelper::onUpgrade方法
        数据库不存在，创建数据库，执行SQLiteOpenHelper::onCreate方法

        注意：mSqLiteOpenHelper.getReadableDatabase();执行以后，才会出现数据库。
         */
        mReadableDatabase = mSqLiteOpenHelper.getReadableDatabase();
    }

    private void initEvent() {
        btnInsert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                insert();
            }
        });
        btnQuery.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                query();
            }
        });
        btnDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                delete();
            }
        });
        btnModify.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                update();
            }
        });
    }

    /**
     * @param requestCode  请求码，相当于给咱们请求的权限数组打个标签
     *                     通过请求码，可以判断出来是对那个请求权限组提交动态权限申请
     * @param permissions  请求的权限数组
     * @param grantResults 请求的权限结果
     *                     <p>
     *                     permissions请求权限数组和grantResults请求权限结果，一一对应的
     */
    @Override
    public void onRequestPermissionsResult(
            int requestCode,
            @NonNull String[] permissions,
            @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //requestCode == 1 代表是请求存储权限的操作，返回的结果
        if (requestCode == 1) {
            /*
            grantResults[0]代表请求权限组第一个权限的结果
            由于，只申请了存储权限，
            所以grantResults[0]代表存储权限申请结果
             */
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                /*
                grantResults[0] == PackageManager.PERMISSION_GRANTED
                表示已经拥有存储权限，可以正常使用存储
                 */
                createHelper();
            }
        }
    }

    /**
     * 添加数据
     */
    private void insert() {
        ContentValues values = new ContentValues();
        //insert into 表明(列1，列2) values（值1，值2）
        values.put("name", etName.getText().toString());
        values.put("age", etAge.getText().toString());
        values.put("gender", etGender.getText().toString());
        long id = mReadableDatabase.insert("student_info", null, values);
        ToastUtil.showToast(this,
                String.format(Locale.CHINA, "添加成功：%d", id));
    }

    /**
     * 查询数据
     */
    private void query() {
        //select 列名 from 表名 where 列1 = 值1 and 列2 = 值2
        //参数2：你所要查询的列。{”name","age","gender"},查询所有传入null/{“*”}
        //参数3：条件（针对列）
        //参数5: 分组
        //参数6：当 group by对数据进行分组后，可以通过having来去除不符合条件的组
        //参数7:排序
        mCursor = mReadableDatabase.query(
                "student_info",
                null,
                null,
                null,
                null,
                null,
                null);

        //SimpleCursorAdapter
        //SimpleAdapter a = new SimpleAdapter()
        //参数3：数据源
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(
                this, R.layout.item_activity_sqlite, mCursor,
                new String[]{"_id", "name", "age", "gender"},
                new int[]{R.id.id_item_activity_sqlite,
                        R.id.name_item_activity_sqlite,
                        R.id.age_item_activity_sqlite,
                        R.id.gender_item_activity_sqlite});
        lvStuInfo.setAdapter(adapter);
    }

    /**
     * 删除数据
     */
    private void delete() {
        mReadableDatabase.delete("student_info",
                "_id = ?",
                new String[]{etId.getText().toString()});
    }

    /**
     * 更新数据
     */
    private void update() {
        ContentValues contentValues = new ContentValues();
        String name = etName.getText().toString();
        String age = etAge.getText().toString();
        String gender = etGender.getText().toString();
        boolean haveData = false;
        if(!TextUtils.isEmpty(name)){
            contentValues.put("name",name);
            haveData = true;
        }
        if(!TextUtils.isEmpty(age)){
            contentValues.put("age",age);
            haveData = true;
        }
        if(!TextUtils.isEmpty(gender)){
            contentValues.put("gender",gender);
            haveData = true;
        }
        if(!haveData){
            //没有数据
            ToastUtil.showToast(this,"没有要修改的数据");
            return;
        }
        mReadableDatabase.update(
                "student_info",
                contentValues,
                "_id = ?",
                new String[]{etId.getText().toString()});
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mCursor != null) {
            mCursor.close();
        }
    }
}
